package qnit.test.hibiernate.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;


 /**
 * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类
 * @ClassName: DateUtils
 * @author QingDao Zengyi Gaoxiao Information Technology Cp.,Ltd 
 * @date 2015年1月17日 上午8:42:27
 * @since 0.1
 * @version 0.1
 *
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
	
	private static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", 
		"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" };

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd）
	 */
	public static String getDate() {
		return getDate("yyyy-MM-dd");
	}
	
	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String getDate(String pattern) {
		return DateFormatUtils.format(new Date(), pattern);
	}
	
	/**
	 * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String formatDate(Date date, Object... pattern) {
		String formatDate = null;
		if (pattern != null && pattern.length > 0) {
			formatDate = DateFormatUtils.format(date, pattern[0].toString());
		} else {
			formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
		}
		return formatDate;
	}
	
	/**
	 * 得到日期时间字符串，转换格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String formatDateTime(Date date) {
		return formatDate(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前时间字符串 格式（HH:mm:ss）
	 */
	public static String getTime() {
		return formatDate(new Date(), "HH:mm:ss");
	}

	/**
	 * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String getDateTime() {
		return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前年份字符串 格式（yyyy）
	 */
	public static String getYear() {
		return formatDate(new Date(), "yyyy");
	}

	/**
	 * 得到当前月份字符串 格式（MM）
	 */
	public static String getMonth() {
		return formatDate(new Date(), "MM");
	}

	/**
	 * 得到当天字符串 格式（dd）
	 */
	public static String getDay() {
		return formatDate(new Date(), "dd");
	}

	/**
	 * 得到当前星期字符串 格式（E）星期几
	 */
	public static String getWeek() {
		return formatDate(new Date(), "E");
	}
	
	/**
	 * 日期型字符串转化为日期 格式
	 * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", 
	 *   "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" }
	 */
	public static Date parseDate(Object str) {
		if (str == null){
			return null;
		}
		try {
			return parseDate(str.toString(), parsePatterns);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 获取过去的天数
	 * @param date
	 * @return
	 */
	public static long pastDays(Date date) {
		long t = new Date().getTime()-date.getTime();
		return t/(24*60*60*1000);
	}
	
    
	public static Date getDateStart(Date date) {
		if(date==null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			date= sdf.parse(formatDate(date, "yyyy-MM-dd")+" 00:00:00");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	public static Date getDateEnd(Date date) {
		if(date==null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			date= sdf.parse(formatDate(date, "yyyy-MM-dd") +" 23:59:59");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	
	/**
	 * 取得数字年 
	 * @param date
	 * @return
	 * 
	 * @datetime 2015年5月5日下午2:15:36
	 * @author yanjr big123@126.com
	 * @version 0.2  @since 0.1
	 */
    public static int getYear(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int year = c.get(Calendar.YEAR);  
        return year;  
    }  
  
    /**
     * 取得日期：月
     * @param date
     * @return
     * 
     * @datetime 2015年5月5日下午2:15:51
     * @author yanjr big123@126.com
     * @version 0.2  @since 0.1
     */
    public static int getMonth(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int month = c.get(Calendar.MONTH);  
        return month + 1;  
    }
    
    /**
     * 取得年中日
     * @param date
     * @return
     * 
     * @datetime 2015年5月5日下午2:20:30
     * @author yanjr big123@126.com
     * @version 0.2  @since 0.1
     */
    public static int getDayOfYear(Date date) {
    	Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int dayOfYear = c.get(Calendar.DAY_OF_YEAR);  
        return dayOfYear;
    }
    
    /**
     * 取得季中日
     * @param date
     * @return
     * 
     * @datetime 2015年5月5日下午3:20:19
     * @author yanjr big123@126.com
     * @version 0.2  @since 0.1
     */
    public static int getDayOfQuarter(Date date) {
    	
        return getPassDayOfQuater(date);
    }
    
    /** 
     * 取得季度天数 
     *  
     * @param date 
     * @return 
     */  
    public static int getDaysOfQuater(Date date) {  
        int day = 0;  
        Date[] seasonDates = getQuarterDate(date);  
        for (Date date2 : seasonDates) {  
            day += getDayOfMonth(date2);  
        }  
        return day;  
    }
    
    /** 
     * 取得季度已过天数 
     *  
     * @param date 
     * @return 
     */  
    public static int getPassDayOfQuater(Date date) {  
        int day = 0;  
  
        Date[] seasonDates = getQuarterDate(date);  
  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int month = c.get(Calendar.MONTH);  
  
        if (month == Calendar.JANUARY || month == Calendar.APRIL  
                || month == Calendar.JULY || month == Calendar.OCTOBER) {// 季度第一个月  
            day = getPassDayOfMonth(seasonDates[0]);  
        } else if (month == Calendar.FEBRUARY || month == Calendar.MAY  
                || month == Calendar.AUGUST || month == Calendar.NOVEMBER) {// 季度第二个月  
            day = getDayOfMonth(seasonDates[0])  
                    + getPassDayOfMonth(seasonDates[1]);  
        } else if (month == Calendar.MARCH || month == Calendar.JUNE  
                || month == Calendar.SEPTEMBER || month == Calendar.DECEMBER) {// 季度第三个月  
            day = getDayOfMonth(seasonDates[0]) + getDayOfMonth(seasonDates[1])  
                    + getPassDayOfMonth(seasonDates[2]);  
        }  
        return day;  
    }
    
    /** 
     * 取得月的剩余天数 
     *  
     * @param date 
     * @return 
     */  
    public static int getRemainDayOfMonth(Date date) {  
        int dayOfMonth = getDayOfMonth(date);  
        int day = getPassDayOfMonth(date);  
        return dayOfMonth - day;  
    }  
  
    /** 
     * 取得月已经过的天数 
     *  
     * @param date 
     * @return 
     */  
    public static int getPassDayOfMonth(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        return c.get(Calendar.DAY_OF_MONTH);  
    }  
  
    /** 
     * 取得该月天数 
     *  
     * @param date 
     * @return 
     */  
    public static int getDaysOfMonth(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        return c.getActualMaximum(Calendar.DAY_OF_MONTH);  
    }
    
    /** 
     * 取得月第一天 
     *  
     * @param date 
     * @return 
     */  
    public static Date getFirstDateOfMonth(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        c.set(Calendar.DAY_OF_MONTH, c.getActualMinimum(Calendar.DAY_OF_MONTH));  
        return c.getTime();  
    }  
  
    /** 
     * 取得月最后一天 
     *  
     * @param date 
     * @return 
     */  
    public static Date getLastDateOfMonth(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));  
        return c.getTime();  
    }  
    
    /** 
     * 取得季度第一天 
     *  
     * @param date 
     * @return 
     */  
    public static Date getFirstDateOfQuater(Date date) {  
        return getFirstDateOfMonth(getQuarterDate(date)[0]);  
    }  
  
    /** 
     * 取得季度最后一天 
     *  
     * @param date 
     * @return 
     */  
    public static Date getLastDateOfQuater(Date date) {  
        return getLastDateOfMonth(getQuarterDate(date)[2]);  
    }
    
    /** 
     * 取得季度月 
     *  
     * @param date 
     * @return 
     */  
    public static Date[] getQuarterDate(Date date) {  
        Date[] quater = new Date[3];  
  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
  
        int nquater = getQuarter(date);  
        if (nquater == 1) {// 第一季度  
            c.set(Calendar.MONTH, Calendar.JANUARY);  
            quater[0] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.FEBRUARY);  
            quater[1] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.MARCH);  
            quater[2] = c.getTime();  
        } else if (nquater == 2) {// 第二季度  
            c.set(Calendar.MONTH, Calendar.APRIL);  
            quater[0] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.MAY);  
            quater[1] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.JUNE);  
            quater[2] = c.getTime();  
        } else if (nquater == 3) {// 第三季度  
            c.set(Calendar.MONTH, Calendar.JULY);  
            quater[0] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.AUGUST);  
            quater[1] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.SEPTEMBER);  
            quater[2] = c.getTime();  
        } else if (nquater == 4) {// 第四季度  
            c.set(Calendar.MONTH, Calendar.OCTOBER);  
            quater[0] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.NOVEMBER);  
            quater[1] = c.getTime();  
            c.set(Calendar.MONTH, Calendar.DECEMBER);  
            quater[2] = c.getTime();  
        }  
        return quater;  
    }  
  
    /**
     * 1 第一季度 2 第二季度 3 第三季度 4 第四季度 
     * @param date
     * @return
     * 
     * @datetime 2015年5月5日下午2:55:00
     * @author yanjr big123@126.com
     * @version 0.2  @since 0.1
     */
    public static int getQuarter(Date date) {  
  
        int quater = 0;  
  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int month = c.get(Calendar.MONTH);  
        switch (month) {  
	        case Calendar.JANUARY:  
	        case Calendar.FEBRUARY:  
	        case Calendar.MARCH:  
	            quater = 1;  
	            break;  
	        case Calendar.APRIL:  
	        case Calendar.MAY:  
	        case Calendar.JUNE:  
	            quater = 2;  
	            break;  
	        case Calendar.JULY:  
	        case Calendar.AUGUST:  
	        case Calendar.SEPTEMBER:  
	            quater = 3;  
	            break;  
	        case Calendar.OCTOBER:  
	        case Calendar.NOVEMBER:  
	        case Calendar.DECEMBER:  
	            quater = 4;  
	            break;  
	        default:  
	            break;  
        }
        return quater;
    }
    
    /**
     * 取得月中日
     * @param date
     * @return
     * 
     * @datetime 2015年5月5日下午2:18:14
     * @author yanjr big123@126.com
     * @version 0.2  @since 0.1
     */
    public static int getDayOfMonth(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);  
        return dayOfMonth;
    }  
  
    /** 
     * 取得周中日 
     *  
     * @param date 
     * @return 
     */  
    public static int getDayOfWeek(Date date) {  
        Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);  
        return dayOfWeek;  
    }  
	
    /**
     * 取得月中周
     * @param date
     * @return
     * 
     * @datetime 2015年5月5日下午2:22:22
     * @author yanjr big123@126.com
     * @version 0.2  @since 0.1
     */
	public static int getWeekOfMonth(Date date) {
		Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int weekOfMonth = c.get(Calendar.WEEK_OF_MONTH);  
        return weekOfMonth;  
	}
	
	/**
	 * 季中周
	 * @param date
	 * @return
	 * 
	 * @datetime 2015年5月5日下午3:49:54
	 * @author yanjr big123@126.com
	 * @version 0.2  @since 0.1
	 */
	public static int getWeekOfQuarter(Date date) {
		Calendar c = Calendar.getInstance();  
        c.setTime(date);
        int week1 = c.get(Calendar.WEEK_OF_YEAR);
		c.setTime(getFirstDateOfQuater(date));
		int week2 = c.get(Calendar.WEEK_OF_YEAR);
		return week1 - week2 + 1;
	}
	
	/**
	 * 取得年中周
	 * @param date
	 * @return
	 * 
	 * @datetime 2015年5月5日下午3:25:54
	 * @author yanjr big123@126.com
	 * @version 0.2  @since 0.1
	 */
	public static int getWeekOfYear(Date date) {
		Calendar c = Calendar.getInstance();  
        c.setTime(date);  
        int weekOfYear = c.get(Calendar.WEEK_OF_YEAR);  
        return weekOfYear;  
	}
	
	/**
	 * 季中月
	 * @param date
	 * @return
	 * 
	 * @datetime 2015年5月5日下午3:59:17
	 * @author yanjr big123@126.com
	 * @version 0.2  @since 0.1
	 */
	public static int getMonthOfQuarter(Date date) {
		return getMonth(date) - (getQuarter(date) - 1)*3;
	}
	
	/**
	 * 年中月
	 * @param date
	 * @return
	 * 
	 * @datetime 2015年5月5日下午3:59:33
	 * @author yanjr big123@126.com
	 * @version 0.2  @since 0.1
	 */
	public static int getMonthOfYear(Date date) {
		
		return getMonth(date);
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/**
	 * @param args
	 * @throws ParseException
	 */
	public static void main(String[] args) throws ParseException {
//		System.out.println(formatDate(parseDate("2010/3/6")));
//		System.out.println(getDate("yyyy年MM月dd日 E"));
//		long time = new Date().getTime()-parseDate("2012-11-19").getTime();
//		System.out.println(time/(24*60*60*1000));
	}
}
